package Servidor;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.util.*;

public class GestorExamen extends TimerTask {

    private AulaVirtual _aulaVirtual;
    public static XStream xstream = null;
    protected int periodoBackup;
    protected Timer timer;

    public GestorExamen(int pBackup) {
        xstream = new XStream(new DomDriver());
        
        xstream.omitField(AulaVirtual.class, "socketCom");
        xstream.omitField(AulaVirtual.class, "socketConexion");
        xstream.omitField(Sesion.class, "socketCom");
		xstream.omitField(Sesion.class, "socketComAvisos");
        
        cargaInicial("backupExt.xml");
        _aulaVirtual.arrancar(4444);

        programarBackup(pBackup);
        
        while(true) {
            _aulaVirtual.entrar();
        }
    }

    public void corregirExamen() {
        Asignatura a;
        int numAlumnos;
        Date fechaLimite;
        Date fechaActual = new Date();

        Examen[] examenes = _aulaVirtual.getExamenes();

        for (int i = 0; i < examenes.length; i++) {

            if (!examenes[i].getCorreccion()) {
                a = examenes[i].getAsignatura();
                numAlumnos = a.getNumAlumnos();
                ArrayList<ExamenEspecifico> examenesRealizados = examenes[i].getExamenesEspecificos();

                fechaLimite = examenes[i].getFechaFinal();
				
				//En verdad debería de ser fechaLimite.before(fechaActual) pero no funciona :S
                if (numAlumnos == examenes[i].getNumExamenesRealizados() || fechaLimite.after(fechaActual)) {
                    examenes[i].corregirExamen();
                }
            }
        }

    }

    public void enviarInfo(Examen ex) {
        Date fechaInicio;
        Boolean enviado;
        ArrayList<Alumno> alumnos;

        Date fechaActual = new Date();

        fechaInicio = ex.getFechaInicial();
        enviado = ex.getEnviado();
		

        if (fechaInicio.before(fechaActual) && enviado == false) {

            alumnos = ex.getAlumnos();
            ex.setEnviado(true);

            for (int j = 0; j < alumnos.size(); j++) {
                AvisoInformacion ai = new AvisoInformacion();
                ai.setAlumno(alumnos.get(j));
                ai.setExamen(ex);
                ai.setLeido(false);
                alumnos.get(j).addAviso(ai);
            }
        }

    }

    public void enviarNotasExamen(String aIdExamen) {
        throw new UnsupportedOperationException();
    }

    private void backup(String aArchivo) {
        String xml = xstream.toXML(_aulaVirtual);

        try {
            FileWriter file_output_xml = new FileWriter(new File(aArchivo));
            file_output_xml.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
            file_output_xml.write(xml);
            file_output_xml.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    private void cargaInicial(String aArchivo) {
        try {
            FileInputStream file_input_xml = new FileInputStream(new File(aArchivo));
            _aulaVirtual = (AulaVirtual) xstream.fromXML(file_input_xml);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }


    private void programarBackup(int pBackup) {
        periodoBackup = pBackup;
        int retardo_inicial = pBackup * 1000; //en milisegundos
        int periodo = pBackup * 1000; //en milisegundos
        timer = new Timer();
        timer.schedule(this, retardo_inicial, periodo);
    }

    @Override
    public void run() {
        backup("backup2.xml");
        corregirExamen();
        for (int i = 0; i < _aulaVirtual.getExamenes().length; i++) {
            enviarInfo((_aulaVirtual.getExamenes())[i]);
        }

        System.out.println("Backup realizado");
    }

    public static void main(String[] args) {
        GestorExamen _gestorExamen = new GestorExamen(3);  //cada 5mn           //TODO: CAMBIAR a 300
    }
}